package com.gjx.leetcode;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

//22. 括号生成
//
//给出 n 代表生成括号的对数，请你写出一个函数，使其能够生成所有可能的并且有效的括号组合。
//
//例如，给出 n = 3，生成结果为：
//
//[
//  "((()))",
//  "(()())",
//  "(())()",
//  "()(())",
//  "()()()"
//]


public class Solution022 {
	public List<String> generateParenthesis(int n) {
        
		List<String> res = new ArrayList<>();
		if (n <= 0) {
			return res;
		}
		
		if (n == 1) {
			res.add("()");
			return res;
		}
		
		List<String> sub = generateParenthesis(n-1);
		
		Set<String> set = new HashSet<String>();
		
		for (String str : sub) {
			for (int i=0; i<str.length(); i++) {
				if (str.charAt(i) == '(') {
					set.add(str.substring(0,i+1) + "()" + str.substring(i+1, str.length()));
				}
			}
			set.add(str + "()");
		}
		
		res.addAll(set);
		return res;
		
    }
	
	public static void main(String[] args) {
		new Solution022().generateParenthesis(3);
	}
}
